<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License. 
-->
<html>
<head>
    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
    <style type="text/css">
        .dp-highlighter {
            width:95% !important;
        }
    </style>
    <style type="text/css">
        .footer {
            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
            background-repeat:     repeat-x;
            background-position:   left top;
            padding-top:           4px;
            color:                 #666;
        }
    </style>
    <link href='https://struts.apache.org/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
    <link href='https://struts.apache.org/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
    <script src='https://struts.apache.org/highlighter/js/shCore.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushXml.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJava.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushBash.js' type='text/javascript'></script>
    <script type="text/javascript">
        SyntaxHighlighter.defaults['toolbar'] = false;
        SyntaxHighlighter.all();
    </script>
    <script type="text/javascript" language="javascript">
        var hide = null;
        var show = null;
        var children = null;

        function init() {
            /* Search form initialization */
            var form = document.forms['search'];
            if (form != null) {
                form.elements['domains'].value = location.hostname;
                form.elements['sitesearch'].value = location.hostname;
            }

            /* Children initialization */
            hide = document.getElementById('hide');
            show = document.getElementById('show');
            children = document.all != null ?
                    document.all['children'] :
                    document.getElementById('children');
            if (children != null) {
                children.style.display = 'none';
                show.style.display = 'inline';
                hide.style.display = 'none';
            }
        }

        function showChildren() {
            children.style.display = 'block';
            show.style.display = 'none';
            hide.style.display = 'inline';
        }

        function hideChildren() {
            children.style.display = 'none';
            show.style.display = 'inline';
            hide.style.display = 'none';
        }
    </script>
    <title>Release Notes 2.0.0</title>
</head>
<body onload="init()">
<table border="0" cellpadding="2" cellspacing="0" width="100%">
    <tr class="topBar">
        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="guides.html">Guides</a>&nbsp;&gt;&nbsp;<a href="migration-guide.html">Migration Guide</a>&nbsp;&gt;&nbsp;<a href="release-notes-200.html">Release Notes 2.0.0</a>
        </td>
        <td align="right" valign="middle" nowrap>
            <form name="search" action="https://www.google.com/search" method="get">
                <input type="hidden" name="ie" value="UTF-8" />
                <input type="hidden" name="oe" value="UTF-8" />
                <input type="hidden" name="domains" value="" />
                <input type="hidden" name="sitesearch" value="" />
                <input type="text" name="q" maxlength="255" value="" />
                <input type="submit" name="btnG" value="Google Search" />
            </form>
        </td>
    </tr>
</table>

<div id="PageContent">
    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">Release Notes 2.0.0</div>

        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=13855">
                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=13855">Edit Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=13855">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=13855">Add Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=13855">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=13855">Add News</a>
        </div>
    </div>

    <div class="pagecontent">
        <div class="wiki-content">
            <div id="ConfluenceContent"><p><a shape="rect" href="release-plan-200.html">Struts 2.0.0</a> is the first distribution of WebWork 2 as an Apache Struts product.</p>

<ul><li>If you are a Maven user, you might want to get started using the <a shape="rect" class="external-link" href="http://cwiki.apache.org/WW/quickstart-using-maven-2.html">Maven Archetype</a>.</li><li>Another quick-start entry point is the <strong>blank</strong> application. Rename and deploy the WAR as a starting point for your own development.</li></ul>


<h2 id="ReleaseNotes2.0.0-KnownIssues">Known Issues </h2>

<ul><li>For known issues, see <a shape="rect" class="external-link" href="https://issues.apache.org/struts/secure/IssueNavigator.jspa?mode=hide&amp;requestId=10692">Struts 2.0.1</a></li></ul>


<h2 id="ReleaseNotes2.0.0-KeySnippets">Key Snippets</h2>

<p>Maven Artifact ID </p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
&lt;dependency&gt;
  &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
    &lt;artifactId&gt;struts2-core&lt;/artifactId&gt;
      &lt;version&gt;2.0.0&lt;/version&gt;
&lt;/dependency&gt;
</pre>
</div></div>

<p>Struts Configuration XML</p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;
&lt;struts&gt;
    &lt;include file="struts-default.xml"/&gt;
    &lt;package name="support" extends="struts-default"&gt;
        &lt;action name="$name" class="$class"&gt;
            &lt;result&gt;$location&lt;/result&gt;
        &lt;/action&gt;
    &lt;/package&gt;
&lt;/struts&gt;
</pre>
</div></div>

<p>XWork Validation XML</p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE validators PUBLIC 
   "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
   "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"&gt;
&lt;validators&gt;
    &lt;field name="$name"&gt;
        &lt;field-validator type="$type"&gt;
            &lt;message&gt;$message&lt;/message&gt;
        &lt;/field-validator&gt;
    &lt;/field&gt;
&lt;/validators&gt;
</pre>
</div></div>

<h2 id="ReleaseNotes2.0.0-NewFeaturesandExtensions">New Features and Extensions</h2>

<ul><li><a shape="rect" href="can-we-use-acegi-security-with-the-framework.html">Can we use Acegi Security with the framework</a> extension is available.</li><li><a shape="rect" href="checkbox-interceptor.html">CheckBox Interceptor</a> detects unchecked checkboxes and adds a parameter with a default value (usually 'false') .</li><li><a shape="rect" href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=33272">JavaServer Faces</a> extension is available.</li><li>A <code>struts.xml</code> file can be placed in a JAR and automatically plugged into an application, so that modules can be self-contained and automatically configured.
	<ul><li>In the case of Freemarker and Velocity modules, the templates can also be loaded from the classpath, so the entire module can be plugged in as a single JAR.</li></ul>
	</li><li><a shape="rect" href="debugging.html">DebuggingInterceptor</a> displays the value stack at runtime.</li></ul>


<h2 id="ReleaseNotes2.0.0-KeyChanges">Key Changes</h2>

<p>Depending on whether you are coming from a Struts 1 or a WebWork 2 background, your perspective on the key changes will differ. </p>

<h3 id="ReleaseNotes2.0.0-FromStruts1">From Struts 1</h3>

<ul><li>See <a shape="rect" href="comparing-struts-1-and-2.html">Comparing Struts 1 and 2</a></li><li><img class="emoticon emoticon-warning" src="https://cwiki.apache.org/confluence/s/en_GB/5982/f2b47fb3d636c8bc9fd0b11c0ec6d0ae18646be7.1/_/images/icons/emoticons/warning.png" data-emoticon-name="warning" alt="(warning)"> More notes to come ...</li></ul>


<h3 id="ReleaseNotes2.0.0-FromWebWork2">From WebWork 2 </h3>

<ul><li>Struts 2 is dependant on XWork 2 (nightly build).</li><li>Java 1.5 is required to build and deploy Struts 2.
	<ul><li>For Java 1.4 deployments, RetroWeaver or RetroTranslater may be used to provide Java 1.4 support</li><li>A pre-packaged set of RetroTranslator JARs is being provided with the distribution.</li></ul>
	</li></ul>


<p>For other changes from WebWork 2, see the "Members to rename", "New property settings", "New features or feature changes", and "Removed or deprecated".</p>

<h4 id="ReleaseNotes2.0.0-Memberstorename">Members to rename </h4>

<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>WebWork 2                  </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Struts 2             </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>com.opensymphony.xwork.*</code>  </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>com.opensymphony.xwork2.*</code> </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>com.opensymphony.webwork.*</code> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>org.apache.struts2.*</code>  </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>xwork.xml</code>               </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>struts.xml</code>        </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>webwork.properties</code>      </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>struts.properties</code> </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>DispatcherUtil              </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Dispatcher            </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>com.opensymphony.webwork.config.Configuration</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>org.apache.struts2.config.Settings</p></td></tr></tbody></table></div>


<p>The tag prefix conventions in the example applications have changed. </p>

<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>JSP        </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> s: </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <em>&lt;s:form ...&gt;</em> </p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Freemarker </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> s. </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <em>&lt;@s.form ...&gt;</em> </p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Velocity   </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> s  </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <em>#sform ( ... )</em> </p></td></tr></tbody></table></div>


<h4 id="ReleaseNotes2.0.0-Newpropertysettings">New property settings </h4>

<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>struts.enable.DynamicMethodInvocation </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> Enable support for the hardwired <code>action!alias</code> syntax (Default is <code>TRUE</code>)</p></td></tr></tbody></table></div>


<div class="confluence-information-macro confluence-information-macro-tip"><span class="aui-icon aui-icon-small aui-iconfont-approve confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>It is recommended that all applications specify the DynamicMethodInvocation setting for now, since the default may change. The recommended approach to action aliasing is to use <a shape="rect" href="action-configuration.html">wildcard aliases</a> instead of the hardwired bang.</p></div></div>

<h4 id="ReleaseNotes2.0.0-Newfeaturesandfeaturechanges">New features and feature changes</h4>

<ul><li>Various changes to ConfigurationManager
	<ul><li>ConfigurationManager is no longer a static factory. It is now an instance created through Dispatcher. Custom configuration could be done through DispatcherListener.</li><li>Custom configuration to ConfigurationManager and Configuration cannot be done statically anymore, instead use Dispatcher's DispatcherListener to achieve the same effect.</li></ul>
	</li><li>The <code>prepare</code> interceptor now uses reflection to call prepare_Method_ where <em>method</em> is the action method configured for the particular action in <code>struts.xml</code>.
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
   &lt;action name="myAction" method="insert" ....&gt;
     .....
   &lt;/action&gt;

   // with the above configuration, and PrepareInterceptor in play, 
   // callsequence will be 
   1] prepareInsert() (If it exists)
   2] prepare() (Unless Interceptor's alwaysInvokePrepare parameter is set to false)
   3] insert()
</pre>
</div></div></li><li>DefaultWorkflowInterceptor (named <code>workflow</code> in <code>struts-default.xml</code>) now uses reflection to call <code>validateMethod</code> on the action class that implements Validateable interface where <code>method</code> is the action method configured for the particular action in <code>struts.xml</code>.
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
&lt;action name="myAction" method="insert" ...&gt;
       ...
    &lt;/action&gt;

    // with the above configuration, and DefaultWorkflowInterceptor in play, 
    // call sequence for action that implements Validateable interface will be 
    1] validateInsert()
    2] validate() (unless Interceptor's alwaysInvokeValidate parameter is set to false)
    3] insert()
</pre>
</div></div></li><li>Datepicker tag is now using dojo's (limited in terms functionality and internationalization)</li><li><a shape="rect" href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=33348">Tiles integration</a> extension is available.</li><li><a shape="rect" href="action-configuration.html">Wildcards</a> can be specified in action mappings.</li><li><a shape="rect" href="message-store-interceptor.html">MessageStoreInterceptor</a> is introduced to allow field errors / action errors and messages to be store and retrieve through session, resulting them to be preservable across request.</li></ul>



<h4 id="ReleaseNotes2.0.0-Removedordeprecated">Removed or deprecated</h4>

<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>AroundInterceptor</p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> The AroundInterceptor has been removed. If your application extends the AroundInterceptor, either import the class into your source code form WebWork 2 (pursuant to the Open Symphony License) and modify it to server as your own base class, or rewrite your interceptor. </p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><code>oldSyntax</code></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> Support for the "oldSyntax" is removed. </p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Rich text editor tag </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> Rich text editor tag has been removed (a possible replacement would be to use the textarea tag with theme="ajax", this will used dojo's rich text editor) </p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;"> &lt;s:textarea theme="ajax" /&gt; </pre>
</div></div>
<p></p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> <code>doActionMethod</code> </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> The convention of trying a "do" form of an action method is not supported. </p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
  &lt;action name="..." method="submit"&gt;
    ...
  &lt;/action&gt;
</pre>
</div></div>
<p>In WebWork,</p>
<ul><li>try to execute <code>submit</code> method in the action, <em>fail</em></li><li>try to execute <code>doSubmit</code> method in the action if Step 1, <em>fail</em></li><li><em>fail</em><br clear="none">
In Struts,</li><li>try to execute <code>submit</code> method in the action, <em>fail</em></li><li><em>fail</em></li></ul>
</td></tr><tr><td></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> <code>default method</code> </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> Calling the "default" method via "doDefault" is not supported.  </p></td></tr></tbody></table></div>


<h3 id="ReleaseNotes2.0.0-Detail">Detail </h3>

<ul><li><a shape="rect" class="external-link" href="https://issues.apache.org/struts/secure/ReleaseNote.jspa?version=21510&amp;styleName=Text&amp;projectId=10030&amp;Create=Create">Release Notes (to date)</a></li></ul>


<h3 id="ReleaseNotes2.0.0-Pendingandopenissues">Pending and open issues</h3>

<div class="aui-message warning jim-inline-block">
    <span class="aui-icon icon-warning"></span>JIRA Issues Macro: com.atlassian.sal.api.net.ResponseStatusException: Unexpected response received. Status code: 404
</div>


<h3 id="ReleaseNotes2.0.0-Otherresources">Other resources </h3>

<ul><li><a shape="rect" class="external-link" href="http://www.mail-archive.com/commits%40struts.apache.org/" rel="nofollow">Commit Logs (Struts 1 and Struts 2)</a></li><li><a shape="rect" class="external-link" href="http://svn.apache.org/viewvc/struts/struts2/trunk/">Source Code Repository (includes change browsing)</a></li></ul></div>
        </div>

        
    </div>
</div>
<div class="footer">
    Generated by CXF SiteExporter
</div>
</body>
</html>
